﻿using Marimo.複雑なストップウォッチ.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Marimo.複雑なストップウォッチ.Model
{
    public class ストップウォッチ : BindableBase
    {
        public ストップウォッチ()
        {
            デフォルト項目 = new スケジュール項目 { 終了時間 = TimeSpan.MaxValue };
        }

        public void 開始する()
        {
            開始時刻 = 現在時刻;
            動作中 = true;
        }

        public void 停止する()
        {
            停止する(経過時間);
        }

        private void 停止する(TimeSpan 停止時刻)
        {
            開始前経過時間 = 停止時刻;
            開始時刻 = null;
            動作中 = false;
        }

        private DateTime? 開始時刻 { get; set; }

        private TimeSpan 開始前経過時間 { get; set; }

        public virtual DateTime 現在時刻
        {
            get
            {
                return DateTime.Now;
            }
        }

        public TimeSpan 経過時間
        {
            get
            {
                スケジュールをチェックする();
                return スケジュールを考慮しない経過時間;
            }
        }

        private TimeSpan スケジュールを考慮しない経過時間
        {
            get
            {
                if (_動作中)
                {
                    return 現在時刻 - 開始時刻.Value + 開始前経過時間;
                }
                else
                {
                    return 開始前経過時間;
                }
            }
        }

        private void スケジュールをチェックする()
        {
            if (スケジュール != null && スケジュール.終了時間 <= スケジュールを考慮しない経過時間)
            {
                停止する(スケジュール.終了時間);
            }
        }

        private bool _動作中;

        public bool 動作中
        {
            get
            {
                スケジュールをチェックする();

                return _動作中;

            }
            private set
            {
                SetProperty(ref _動作中, value);
            }
        }

        private スケジュール _スケジュール;
        public スケジュール スケジュール
        {
            get
            {
                return _スケジュール;
            }
            set
            {
                SetProperty(ref _スケジュール, value);
            }
        }

        public スケジュール項目 表示中項目
        {
            get
            {
                return デフォルト項目;
            }
        }

        private スケジュール項目 デフォルト項目 { get; set; }
    }
}
